#include "Tile.h"
#include "TextureManager.h"

using namespace game_engine;
using namespace game_engine::tile_engine;
using namespace game_engine::open_gl;
using namespace game_engine::utils;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////
Tile::Tile(void)
    : worldPosition(), tileType(UNWALKABLE), textureName(), frame()
{
}

Tile::Tile(const Point &pos, const utils::Rect &rect)
    : worldPosition(pos), tileType(UNWALKABLE), textureName(), frame(rect)
{
}

Tile::Tile(const string &texture, const Rect &rect)
    : worldPosition(), tileType(UNWALKABLE), textureName(texture), frame(rect)
{
}

Tile::~Tile(void)
{
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

void Tile::drawInRect(const Rect &rect) const
{
    TextureManager *tm = TextureManager::getInstance();
    GLTexture2D tex = tm->getTexture(textureName);
    tex.drawInRect(rect, frame);
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

const Point Tile::getWorldPosition(void) const
{
    return worldPosition;
}

const Rect Tile::getBoxCollider(void) const
{
    return Rect(worldPosition.getX(), worldPosition.getY(),
        frame.getHeight(), frame.getWidth());
}

const string& Tile::getTextureName(void) const
{
    return textureName;
}

const Rect& Tile::getFrame(void) const
{
    return frame;
}

const TileType Tile::getTileType(void) const
{
    return tileType;
}

///////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////

void Tile::setTextureName(const string &name)
{
    textureName = name;
}

void Tile::setFrame(const Rect &rect)
{
    frame = rect;
}

void Tile::setTileType(const INT32 t)
{
    switch(t)
    {
    case 0:
        tileType = WALKABLE;
        break;
    case 1:
        tileType = UNWALKABLE;
        break;
    case 2:
        tileType = DAMAGE;
        break;
    case 3:
        tileType = DEATH;
        break;
    default:
        tileType = WALKABLE;
        break;
    }
}
